package com.nicolas.pattern.singleton;

/**
 * 懒汉式单例
 * 懒汉式单例在第一次调用getInstance()方法时实例化，在类加载时并不自行实例化，这种技术又称为延迟加载(Lazy Load)技术，
 * 即需要的时候再加载实例，为了避免多个线程同时调用getInstance()方法，我们可以使用关键字synchronized，
 * 
 * 在synchronized中再进行一次(instance == null)判断，这种方式称为双重检查锁定(Double-Check Locking)
 * @author nicolas
 *
 */
public class LazySingleton {
	private volatile static LazySingleton instance = null;   
	  
    private LazySingleton() { }   
  
    public static LazySingleton getInstance() {   
        //第一重判断  
        if (instance == null) {  
            //锁定代码块  
            synchronized (LazySingleton.class) {  
                //第二重判断  
                if (instance == null) {  
                    instance = new LazySingleton(); //创建单例实例  
                }  
            }  
        }  
        return instance;   
    }  
}
